package com.tuanzi.loan.workflow.service;

import java.io.InputStream;
import java.util.Date;
import java.util.List;
import java.util.Map;

import org.springframework.data.domain.Page;

import com.tuanzi.loan.core.vo.PageSearcher;
import com.tuanzi.loan.vo.request.system.ProcessInstanceSearchRequest;
import com.tuanzi.loan.workflow.common.EndEventType;
import com.tuanzi.loan.workflow.listener.WorkflowListener;
import com.tuanzi.loan.workflow.vo.ActivityResponse;
import com.tuanzi.loan.workflow.vo.ProcessInstanceResponse;
import com.tuanzi.loan.workflow.vo.TaskResponse;
import com.tuanzi.loan.workflow.vo.TrackingResponse;
import com.tuanzi.loan.workflow.vo.request.CommitTaskRequest;

/**
 * @author Ray
 * @date 2018/01/23
 */
public interface WorkflowProcessorService {

	//
	// /**
	// * 职责：启动自动执行流程
	// *
	// * @param procDefKey
	// * 流程定义的key，可以到流程定义栏目查询
	// * @param busiKey
	// * 业务Key，采用业务对象类名.ID标记，比如，项目对象，id为123，则busiKey为"Project.123"
	// * @param title
	// * 新建流程的标题
	// * @param variables
	// * 流程变量，可为空
	// * @param urlParam
	// * busiKey
	// * @return
	// * @throws Exception
	// */
	// ProcessInstanceVO startAutoProcessInstance(String procDefKey, String
	// busiKey,
	// String title,
	// Map<String, Object> variables, Map<String, String> urlParam);
	//

	ProcessInstanceResponse findProcessInstanceByProcInstId(String procInstId);

	List<ProcessInstanceResponse> findProcessInstanceByBusinessKey(String businessKey);

	/**
	 * 职责：查询任务
	 * 
	 * @param procInstId
	 *            流程实例id
	 * @param account
	 *            任务执行者帐号
	 */
	TaskResponse findTask(String procInstId, String account);

	/**
	 * 职责：查询任务
	 * 
	 * @param taskId
	 *            任务id
	 */
	TaskResponse findTask(String taskId);

	/**
	 * 查询历史任务
	 * 
	 * @param taskId
	 * @return
	 */
	TaskResponse findHistoricalTask(String taskId);

	//
	// /**
	// * 职责：完成任务
	// * @param sendRequest 任务id
	// */
	// void sendTask(SendRequest sendRequest);
	//
	// /**
	// * 职责：取回流程，注意不是回退！
	// * @param taskId 当前任务ID
	// */
	// void callBack(String taskId);
	//
	// /**
	// * 职责：驳回操作
	// * @param taskId 当前任务ID
	// * @throws Exception
	// */
	// void reject(String taskId);
	//
	// /**
	// * 职责：驳回操作
	// * @throws Exception
	// */
	// BaseResponse<String> reject(FormRejectRequest request);
	//
	// /**
	// * 职责：驳回操作
	// * @param taskId 当前任务ID
	// * @param targetActivityId 驳回节点的ID
	// * @param targetAccount 驳回节点的执行者
	// * @throws Exception
	// */
	// void reject(String taskId, String targetActivityId, String
	// targetAccount);
	//
	/**
	 * 职责：自由流实现，指定当前活动id，以及跳转目标活动id
	 * 
	 * @param procInstId
	 *            流程实例id
	 * @param targetActivityId
	 *            跳转目标活动id
	 * @param jumpOriginActivityId
	 *            当前活动id
	 * @param targetActivityAssigneeAccount
	 *            跳转目标活动执行人帐号
	 * @throws Exception
	 */
	void jumpActivity(String procInstId, String targetActivityId, String jumpOriginActivityId,
			String targetActivityAssigneeAccount);

	/**
	 * 职责：自由流实现，指定当前活动id，以及跳转目标活动id
	 *
	 * @param procInstId
	 *            流程实例id
	 * @param taskId
	 *            当前任务id
	 * @param targetActivityId
	 *            跳转目标活动id
	 * @param jumpOriginActivityId
	 *            当前活动id
	 * @param targetActivityAssigneeAccount
	 *            跳转目标活动执行人帐号
	 * @throws Exception
	 */
	void jumpActivityBack(String procInstId, String taskId, String targetActivityId, String jumpOriginActivityId,
			String targetActivityAssigneeAccount);

	/**
	 * <pre>
	 * 职责：根据流程实例id获取后续环节。
	 * 注意：通过ActivityVO的assignee属性可获取角色id，通过角色id可获取可选的后续处理人
	 * </pre>
	 *
	 * @param procInstId
	 *            流程实例id
	 * @param currentActivityId
	 *            当前节点编号
	 * @return
	 * @throws Exception
	 */
	List<ActivityResponse> findNextActivity(String procInstId, String currentActivityId);

	ActivityResponse findActivity(String procInstId, String activityId);

	/**
	 * <pre>
	 * 职责：根据流程实例id获取已完成的任务。
	 * </pre>
	 * 
	 * @param procInstId
	 *            流程实例id
	 * @return
	 * @throws Exception
	 */
	List<TaskResponse> findAllFinishedTask(String procInstId);

	/**
	 * <pre>
	 * 职责：根据流程实例id和任务id获取历史任务实例。
	 * </pre>
	 * 
	 * @param procInstId
	 *            流程实例id
	 * @param taskId
	 *            任务id
	 * @return
	 * @throws Exception
	 */
	TaskResponse findFinishedTaskByTaskId(String procInstId, String taskId);

	/**
	 * <pre>
	 * 职责：获取上一步已完成的任务。
	 * </pre>
	 * 
	 * @param procInstId
	 *            流程实例id
	 * @param currTaskId
	 *            当前任务id
	 * @param startTime
	 * @return
	 * @throws Exception
	 */
	TaskResponse findLastFinishedTask(String procInstId, String currTaskId, Date startTime);

	//
	// /**
	// * <pre>
	// * 职责：根据流程实例id获取所有环节，并去掉当前环节。
	// * 注意：通过ActivityVO的assignee属性可获取角色id，通过角色id可获取可选的后续处理人
	// * </pre>
	// * @param procInstId 流程实例id
	// * @param currActivityId 当前节点编号
	// * @return
	// * @throws Exception
	// */
	// BaseResponse<List<ActivityVO>> getAllActivity(AllActivityGetRequest
	// request);
	//
	// /**
	// * 获取流程定义的第一个Task的id
	// *
	// * @param procInstId 流程实例Id
	// * @return
	// * @throws Exception
	// */
	// String getFirstTaskId(String procInstId);
	//
	TaskResponse findFirstTaskByProcInstId(String procInstId);

	//
	// /**
	// * 职责：判断用户是否有权限启动流程
	// * @Param procDefId 流程定义id;
	// * @param user 指定用户
	// * @return
	// * @throws Exception
	// */
	// boolean hasActivityRight(String procDefId, String activityId,
	// BossUserResponse user);
	//
	// /**
	// * 通过流程实例的业务Key查找对应流程实例的ID
	// * @param busiKey
	// * @return
	// * @throws Exception
	// */
	// String getProcInstIdByBusinessKey(String busiKey);
	//
	// /***
	// * 通过流程实例id查询活动id
	// * @param procInstId
	// * @return
	// * @throws Exception
	// */
	// String getActivitiIdByProcInstId(String procInstId);
	//
	// /***
	// * 通过流程实例id查询活动对象
	// * @param procInstId
	// * @return
	// * @throws Exception
	// */
	// List<ActivityVO> getActivityVOByProcInstId(String procInstId);
	//
	/**
	 * 职责：获取流程变量
	 *
	 * @param procInstId
	 *            流程实例id
	 */
	Map<String, Object> getVariable(String procInstId);

	/**
	 * 职责：获取流程变量
	 *
	 * @param procInstId
	 *            流程实例id
	 * @param varName
	 *            变量名称
	 */
	Object getVariable(String procInstId, String varName);

	/**
	 * 职责：设置流程变量
	 * 
	 * @param procInstId
	 *            流程实例id
	 * @param varName
	 * @param varValue
	 * @throws Exception
	 */
	void setVariable(String procInstId, String varName, Object varValue);

	/**
	 * 职责：业务模块可增加自定义事件监听器
	 * 
	 * @param listener
	 *            工作流时间监听器对象
	 * @throws Exception
	 */
	void addListener(WorkflowListener listener);

	/**
	 * 职责：业务模块可移除自定义事件监听器
	 * 
	 * @param listener
	 * @throws Exception
	 */
	void removeListener(WorkflowListener listener);

	/**
	 * 职责：结束流程实例
	 *
	 * @param procInstId
	 *            流程实例id
	 * @throws Exception
	 */
	void endProcess(String procInstId);

	/**
	 * 职责：挂起（冻结，办理人看不到待办）流程实例
	 *
	 * @param procInstId
	 *            流程实例id
	 * @throws Exception
	 */
	void suspendProcess(String procInstId);

	/**
	 * 职责：唤醒（挂起后，办理人重新看到待办）流程实例
	 *
	 * @param procInstId
	 *            流程实例id
	 * @throws Exception
	 */
	void activateProcess(String procInstId);

	//
	// /**
	// * 职责：复活（送结束后，办理人重新看到待办）流程实例
	// * @param procInstId 流程实例id
	// * @throws Exception
	// */
	// void resurgenceProcess(String procInstId);
	//
	// /**
	// * 职责：删除流程实例，注意：只删除正在流转的实例记录，历史记录还是会被保留的，删除时最好填写删除原因
	// * @param procInstId 流程实例id
	// * @param deleteReason 删除原因
	// * @throws Exception
	// */
	// void deleteProcess(String procInstId, String deleteReason);
	//
	// /**
	// * 职责：完全删除该流程实例
	// * @param procInstId 流程实例id
	// * @param deleteReason 删除原因
	// * @throws Exception
	// */
	// BaseResponse<Void> deleteProcessWithHistory(String procInstId, String
	// deleteReason);
	//
	// /**
	// * 获取流程实例当前任务的处理人用户
	// *
	// * @param procInstId 流程实例id
	// * @throws Exception
	// */
	// BaseResponse<BossUserResponse> getProcInstCurrUser(String procInstId);
	//
	// /**
	// * 获取流程实例的当前任务，如果流程实例已结束，则返回null
	// *
	// * @param procInstId 流程实例id
	// * @return
	// * @throws Exception
	// */
	// TaskVO getProcInstCurrTask(String procInstId);
	//
	// /**
	// * 批量获取流程实例的当前任务，如果流程实例已结束，则返回null
	// *
	// * @param procInstIds 流程实例id列表
	// * @return
	// * @throws Exception
	// */
	// List<TaskVO> getProcInstCurrTask(List<String> procInstIds) ;
	//
	// /**
	// * 职责：获取当前用户有权限发起流程的流程定义列表
	// * @param user 当前用户对象，不允许为空
	// * @return
	// */
	// List<ProcessDefinitionVO> getAvailableProcDefList(BossUserResponse user);
	//
	/**
	 * 根据活动节点获取可选得用户列表
	 * 
	 * @return
	 */

	/**
	 * 获取流转过的活动节点
	 * 
	 * @param taskId
	 *            当前任务id
	 * @return 当前任务之前执行过的任务列表
	 * @throws Exception
	 */
	List<TaskResponse> findPassedTaskResponse(String taskId);

	//
	// /**
	// * 设置流程实例变量，假如该变量已存在，则不会赋值
	// * @param procInstId 流程实例id
	// * @param varKey 变量key
	// * @param varValue 变量值
	// * @throws Exception
	// */
	// void setProcInstVariablesWithCheck(String procInstId, String varKey,
	// Object
	// varValue);
	//
	// /**
	// * 设置流程实例变量
	// * @param procInstId 流程实例id
	// * @param varKey 变量key
	// * @param varValue 变量值
	// * @throws Exception
	// */
	// void setProcInstVariables(String procInstId, String varKey, Object
	// varValue);
	//
	// /**
	// * 任务转办。注意：目前转办后，没有保留任何痕迹
	// * @param taskId 任务id
	// * @param transferUserAccount 用户帐号，是转办对象
	// * @param orginUser 原始用户
	// * @throws Exception
	// */
	// BaseResponse<Void> transferAssignee(AssigneeTransferRequest request);
	//
	// /**
	// * 流程结束后，强制拉回重做上一个节点
	// * @param procInstId 流程实例id
	// * @throws Exception
	// */
	// BaseResponse<Void> callBackAfterEnding(String procInstId);
	//
	// /**
	// * 获取当前实例的当前版本
	// *
	// * @param procInstId 流程实例id
	// * @return
	// * @throws Exception
	// */
	// int getProcInstCurrVersion(String procInstId);
	//
	// /**
	// *
	// * 获取当前节点类型 1-userTask，2-multiInstance，3-exclusiveGateway,4-subProcess,
	// * 5-parallelGateway,6-其他
	// * @author huangza
	// * @param procInstId 流程实例id
	// * @param currActivityId 当前节点id
	// * @return
	// */
	// int getNextActivityBehavior(String procInstId, String currActivityId);
	//
	// /**
	// * 职责：完成任务(并行网关)
	// * @author huangza
	// * @param sendVOs 任务id
	// */
	// void sendTasks(List<SendVO> sendVOs);
	//
	// /**
	// * 发信号给接收任务
	// * @param request
	// * @throws Exception
	// */
	// BaseResponse<Void> signal(SignalRequest request);
	//
	// /**
	// * 是否允许发送
	// * @param request
	// * @return
	// */
	// BaseResponse<Void> canSend(FormCanSendRequest request) throws
	// IllegalAccessException, InvocationTargetException;
	//
	//
	// /**
	// * 是否最后一个节点endEvent
	// * @param nextActivity
	// * @return
	// */
	EndEventType getEndEventType(ActivityResponse nextActivity);

	//
	/**
	 * 启动业务流程
	 * 
	 * @return
	 */
	ProcessInstanceResponse startProcess(String account, String procDefKey, String title, List<String> businessKeys,
			Map<String, Object> variables);

	/**
	 * 启动业务流程
	 * 
	 * @return
	 */
	ProcessInstanceResponse startProcess(String account, String assignee, String procDefKey, String title,
			List<String> businessKeys, Map<String, Object> variables);

	/**
	 * 审批任务
	 * 
	 * @param rquest
	 * @return
	 */
	void approve(CommitTaskRequest rquest);

	/**
	 * 作废任务
	 * 
	 * @param rquest
	 * @return
	 */
	void cancel(CommitTaskRequest rquest);

	/**
	 * 拒绝任务
	 * 
	 * @param rquest
	 * @return
	 */
	void reject(CommitTaskRequest rquest);

	/**
	 * 回退流程到上一个节点
	 * 
	 * @param taskId
	 */
	void back(String procInstId, String taskId);

	/**
	 * 同意任务
	 * 
	 * @param rquest
	 * @return
	 */
	void pass(CommitTaskRequest rquest);

	List<TrackingResponse> findProcessTrackingByProcInstId(String procInstId);

	InputStream findProcessTrackingImageByProcInstId(String procInstId);

	/**
	 * 职责：查询流程实例分页
	 *
	 * @return
	 */
	Page<ProcessInstanceResponse> listProcessInstance(PageSearcher<ProcessInstanceSearchRequest> request);
	//
	// /**
	// * 回退至第一个节点
	// * @param request
	// * @return
	// */
	// BaseResponse<String> rejectToFirstTask(RejectToFirstTaskRequest request);
}
